package com.itheima.edu.info.manager.dao;

import com.itheima.edu.info.manager.domain.Student;

import java.util.ArrayList;

/*
    升级:
        将系统容器由数组升级为集合!
 */
public class OtherStudentDao implements BaseStudentDao{
    //1. 定义一个系统数据仓库: 集合实现
    private static ArrayList<Student> stus = new ArrayList<>();

    //静态代码块: 随着类的加载而自动执行!在一次程序运行过程中,一个类只会加载一次,所以静态代码块也只执行一次!
    //作用: 一般都会用来做数据的初始化,系统配置的加载!
    static {
        System.out.println("-------------系统数据加载中Loading--------------");
        Student stu1 = new Student("heima001", "柳岩", "36", "1999-11-11");
        Student stu2 = new Student("heima002", "杨幂", "35", "1995-11-11");
        //将学生对象存入集合容器
        stus.add(stu1);
        stus.add(stu2);
    }

    //库管类中的添加学生功能
    public boolean addStudent(Student stu) {
        stus.add(stu);
        return true;
    }

    //库管类中的查看学生功能
    public Student[] findAllStudent() {
        //将集合转成数组返回
        //1. 定义一个数组
        Student[] stuArray = new Student[stus.size()];

        //2. 遍历集合,将每一个元素复制到数组中
        for (int i = 0; i < stus.size(); i++) {
            Student stu = stus.get(i);
            stuArray[i] = stu;
        }

        return stuArray;
    }

    //库管类中的删除学生功能
    public boolean deleteStudent(String deleteId) {
        //1. 找到本次要删除的学号所对应的学生对象在数组中所对应的索引位置
        int index = getIndex(deleteId);
        //2. 根据index的值来决定是否删除成功
        if (index == -1) {
            // 说明传过来的学号在系统里不存在,直接返回false,表示删除失败
            return false;
        } else {
            stus.remove(index);
            return true;
        }
    }

    //库管类中的修改学生功能
    public void updateStudent(String updateId, Student newStu) {
        //1. 根据要修改的学号找到对应的学生在数组中的索引位置
        int index = getIndex(updateId);

        //2. 拿新的学生对象去替换该索引位置原本的老对象.从而达到修改目的.
        stus.set(index,newStu);
    }

    //封装一个根据学号查找学生对象在数组中的索引位置的方法
    public int getIndex(String id) {
        //先假设学号不存在
        int index = -1;
        //遍历数组
        for (int i = 0; i < stus.size(); i++) {
            Student stu = stus.get(i);
            //当前索引位置的元素不为null并且该元素的学号和要查找的学号一致时,修改标记
            if (stu != null && stu.getId().equals(id)) {
                //修改标记,记录当前学生对象的索引值
                index = i;
                break;
            }
        }
        //返回index即可
        return index;
    }
}
